package com.yuanzong.wuliu.service.admin.system.user;

import com.yuanzong.wuliu.common.exception.BusinessException;
import com.yuanzong.wuliu.common.utils.id.SnowFlakeUtils;
import com.yuanzong.wuliu.common.utils.password.MD5Utils;
import com.yuanzong.wuliu.common.vo.ApiResult;
import com.yuanzong.wuliu.common.vo.ApiResultPage;
import com.yuanzong.wuliu.controller.admin.system.user.param.AdminSystemUserAddParam;
import com.yuanzong.wuliu.controller.admin.system.user.param.AdminSystemUserModifyPasswordParam;
import com.yuanzong.wuliu.controller.admin.system.user.param.AdminSystemUserPageParam;
import com.yuanzong.wuliu.controller.admin.system.user.param.AdminSystemUserRemoveParam;
import com.yuanzong.wuliu.controller.intercdeptor.AdminHandlerInterceptorAdapter;
import com.yuanzong.wuliu.model.system.user.SystemUser;
import com.yuanzong.wuliu.model.system.user.query.SystemUserPageQuery;
import com.yuanzong.wuliu.service.system.user.factory.SystemUserFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
public class AdminSystemUserService {

    public ApiResult page(AdminSystemUserPageParam param) throws Exception {
        // ===================================================================================//
        // ===== 当前登陆用户
        // ===================================================================================//
        SystemUser runtimeUser = AdminHandlerInterceptorAdapter.getRuntimeUser();
        // ===================================================================================//
        // ===== 参数校验
        // ===================================================================================//
        if (param == null) {
            throw new BusinessException("参数为空");
        }
        // ===================================================================================//
        // ===== 业务执行
        // ===================================================================================//
        SystemUserPageQuery systemUserPageQuery = new SystemUserPageQuery();
        BeanUtils.copyProperties(param, systemUserPageQuery);
        systemUserPageQuery.setNoUsername("admin");
        ApiResultPage<SystemUser> apiResultPage = SystemUserFactory.getSystemUserService().pageSubject(systemUserPageQuery);
        return ApiResult.success(apiResultPage);
    }

    public ApiResult add(AdminSystemUserAddParam param) throws Exception {
        // ===================================================================================//
        // ===== 当前登陆用户
        // ===================================================================================//
        SystemUser runtimeUser = AdminHandlerInterceptorAdapter.getRuntimeUser();
        // ===================================================================================//
        // ===== 参数校验
        // ===================================================================================//
        if (param == null) {
            throw new BusinessException("参数为空");
        }
        SystemUser systemUser = SystemUserFactory.getSystemUserService().queryByUsername(param.getUsername());
        if (systemUser != null) {
            throw new BusinessException("用户名已存在");
        }
        // ===================================================================================//
        // ===== 业务执行
        // ===================================================================================//
        systemUser = new SystemUser();
        systemUser.setId(SnowFlakeUtils.getId());
        systemUser.setUsername(param.getUsername());
        systemUser.setPassword(MD5Utils.MD5(param.getPassword()));
        systemUser.setNickname(param.getNickname());
        systemUser.setType(1);
        systemUser.setStatus(1);
        systemUser.setCreateTime(LocalDateTime.now());
        SystemUserFactory.getSystemUserService().save(systemUser);
        return ApiResult.success();
    }

    public ApiResult modifyPassword(AdminSystemUserModifyPasswordParam param) throws Exception {
        // ===================================================================================//
        // ===== 当前登陆用户
        // ===================================================================================//
        SystemUser runtimeUser = AdminHandlerInterceptorAdapter.getRuntimeUser();
        // ===================================================================================//
        // ===== 参数校验
        // ===================================================================================//
        if (param == null) {
            throw new BusinessException("参数为空");
        }
        SystemUser systemUser = SystemUserFactory.getSystemUserService().getById(param.getId());
        if (systemUser == null) {
            throw new BusinessException("用户不存在");
        }
        // ===================================================================================//
        // ===== 业务执行
        // ===================================================================================//
        systemUser.setPassword(MD5Utils.MD5(param.getPassword()));
        SystemUserFactory.getSystemUserService().updateById(systemUser);
        return ApiResult.success();
    }

    public ApiResult remove(AdminSystemUserRemoveParam param) throws Exception {
        // ===================================================================================//
        // ===== 当前登陆用户
        // ===================================================================================//
        SystemUser runtimeUser = AdminHandlerInterceptorAdapter.getRuntimeUser();
        // ===================================================================================//
        // ===== 参数校验
        // ===================================================================================//
        if (param == null) {
            throw new BusinessException("参数为空");
        }
        // ===================================================================================//
        // ===== 业务执行
        // ===================================================================================//
        SystemUserFactory.getSystemUserService().removeById(param.getId());
        return ApiResult.success();
    }
}
